#include "FileSharingProcess.h"

FileSharingProcess::FileSharingProcess(LogFile* logFile) : Process(logFile) {
	this->cleanAll = false;
}

void FileSharingProcess::setFiles(list<string> files) {
	this->files = files;
}

void FileSharingProcess::setIsExclusion(bool isExclusion) {
	this->isExclusion = isExclusion;
}

void FileSharingProcess::setRequestFifoName(string fifoName) {
	mkdir(ROOTDIRECTORY, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);

	this->fifoName = ROOTDIRECTORY + fifoName;
}

void FileSharingProcess::setCleanAll(bool cleanAll) {
	this->cleanAll = cleanAll;
}

int FileSharingProcess::doWork() {
	this->logFile->log("[" + this->getProcessName() + "] " + "Abriendo archivo compartido.");
	SharedFile file;

	this->logFile->log("[" + this->getProcessName() + "] " + "Bloqueando archivo compartido para escritura.");
	file.getWriteLock();

	if (this->cleanAll) {
		this->logFile->log("[" + this->getProcessName() + "] " + "Eliminando archivos compartidos.");
		while (!file.isEOF()) {
			SharedRecord readRecord = file.getNextRecord();
			string fifo1 = readRecord.requestFifo;
			string path1 = readRecord.sharedFilePath;

			this->logFile->log("[" + this->getProcessName() + "] " + "Procesando registro (file: " + path1 + " - fifo: " + fifo1 + ")");
			if (fifo1 == this->fifoName) {
				strcpy(readRecord.requestFifo, "");
				strcpy(readRecord.sharedFilePath, "");
				int pos = file.currentPosition();
				file.goTo(pos - 1);
				file.addRecord(readRecord);
				file.goTo(pos);
			}
		}

		this->cleanAll = false;
	} else {
		list<string>::iterator it = this->files.begin();
		while (it != this->files.end()) {
			SharedRecord record;
			strcpy(record.requestFifo, this->fifoName.c_str());
			strcpy(record.sharedFilePath, (*it).c_str());

			if (this->isExclusion) {
				this->logFile->log("[" + this->getProcessName() + "] " + "Eliminando el archivo " + *it + ".");
				file.removeRecord(record);
			} else {
				this->logFile->log("[" + this->getProcessName() + "] " + "Insertando el archivo " + *it + ".");
				file.goToEnd();
				file.addRecord(record);
			}

			++it;
		}

		this->isExclusion = false;
	}

	this->logFile->log("[" + this->getProcessName() + "] " + "Desbloqueando archivo compartido.");
	file.unlock();

	this->logFile->log("[" + this->getProcessName() + "] " + "Lanzando señal para notificar terminacion del uso del archivo compartido.");
	raise(SIGUSR1);

	return 0;
}

string FileSharingProcess::getProcessName() {
	return string("FileSharing");
}

FileSharingProcess::~FileSharingProcess() {
}

